<?php

require_once dirname(__FILE__).'/../lib/realesGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/realesGeneratorHelper.class.php';

/**
 * reales actions.
 *
 * @package    plagas
 * @subpackage reales
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class realesActions extends autoRealesActions
{
  public function executeIndex(sfWebRequest $request)
  {
    //$this->reales = Doctrine_Core::getTable('reales')->getTopReales(null, null, null);
    $this->reales=null;
    $this->filtro = new realesFormFilter();
  }

  public function executeFilter(sfWebRequest $request)
  {
    $this->filtro = new realesFormFilter();
    if($request->isMethod('post'))
    {
        $this->filtro->bind($request->getParameter($this->filtro->getName()));
    }
    //$query = $this->filtro->buildQuery($this->filtro->getValues());
    $indicador_id = $this->filtro->getValue('indicador_id');
    $ano = $this->filtro->getValue('ano');
    $mes = $this->filtro->getValue('mes');
    if ($indicador_id == '') $indicador_id = null;
    if ($ano == '') $ano = null;
    if ($mes == '') $mes = null;

    $this->reales = Doctrine_Core::getTable('reales')->getTopReales($indicador_id,$ano,$mes);
    //$this->filtro = new realesFormFilter();
    $this->setTemplate('index');
  }

  public function executeNew(sfWebRequest $request)
  {
    $ids = $this->getUser()->getAttribute('ids');

    $this->indicadores = Doctrine_Query::create()
      ->from('indicador')
      ->whereIn('id', $ids)
      ->execute();

    $this->form = $this->configuration->getForm();
    $this->reales = $this->form->getObject();
  }

  public function executeCreate(sfWebRequest $request)
  {
        $this->form = $this->configuration->getForm();
        $allFormValues = $request->getParameter($this->form->getName());

        $ids = $this->getUser()->getAttribute('ids');
        $ano = $allFormValues["ano"];
        $mes = $allFormValues["mes"];

        if ($ano == null || $mes == null)
        {
            $this->getUser()->setFlash('error','Complete los campos año y mes.');
            $this->redirect('reales/new');
        }
        $this->getUser()->getAttributeHolder()->remove('ids');
        $indicadores = Doctrine_Query::create()
            ->from('indicador')
            ->whereIn('id', $ids)
            ->execute();
        $error = '';
        $notice = '';
        $actualizado = '';
        $ejecutado = '';
        foreach ($indicadores as $indi)
        {
            switch ($this->ejecutarIndicador($indi, $ano, $mes))
            {
            case 'cero': $error .= $indi->getNombre().', ';                break;
            case 'actualizado': $actualizado .= $indi->getNombre().', ';                break;
            case 'ejecutado': $ejecutado .= $indi->getNombre().', ';                break;
            }
        }
        if ($actualizado != '') $notice .= 'Los siguientes indicadores fueron actualizados: '.$actualizado;
        if ($ejecutado != '') $notice .= 'Los siguientes indicadores fueron ejecutados: '.$ejecutado;

        if ($notice != '')
            $this->getUser()->setFlash('notice',$notice);

        if ($error != '')
            $this->getUser()->setFlash('error','Los siguientes indicadores no se ejecutaron: '.$error);

            $this->redirect('indicador');
    }

  public function executeShow(sfWebRequest $request)
  {
    $indicador = $request->getParameter('indicador_id');
    $ano = $request->getParameter('ano');
    $mes = $request->getParameter('mes');
    $this->reales = Doctrine_Core::getTable('reales')->getChildReales($indicador,$ano,$mes);
  }

  public function ejecutarIndicador($indicador, $ano, $mes)
  {
        //OBTENGO LAS CONSULTAS SQL DEL NUMERADOR Y DENOMINADOR
        $num = $indicador->getNumerador();
        $den = $indicador->getDenominador();

        //SI LAS CONSULTAS TIENEN UN "WHERE" AGREGO UN "AND" PARA FILTRAR POR AñO Y MES
        if($this->tieneWhere($num))
        {
            $num = $num.' AND';
        }
        else
        {
            $num = $num.' WHERE';
        }
        if($this->tieneWhere($den))
        {
            $den = $den.' AND';
        }
        else
        {
            $den = $den.' WHERE';
        }

        //FILTRO POR ANO Y MES
        $mesYano = ' MONTH(created_at) = '.$mes.' AND YEAR(created_at) = '.$ano;
        $num = $num.$mesYano;
        $den = $den.$mesYano;

        //EJECUTO LAS CONSULTAS SQL
        $num = $this->ejecutarSQL($num);
        $den = $this->ejecutarSQL($den);

        //VALIDAR QUE EL DENOMINADO NO SEA CERO
        $valor;
        if ($den[0][0] == 0)
        {
            return 'cero';
            //$valor = 0;
            //$this->getUser()->setFlash('error', sprintf('No se ejecuto el indicador. La consulta del denominador arrojo 0 resultados'));
            //$this->redirect('indicador');
        }
        else //EL DENOMINADOR NO ES CERO
        {
            $valor = $num[0][0] / $den[0][0];

            //SI ESTE INDICADOR YA FUE EJECUTADO, ACTUALIZO SOLO EL VALOR
            $q = Doctrine_Query::create()
              ->from('reales r')
              ->where('r.indicador_id = ?', $indicador->getId())
              ->andWhere('r.ano = ?', $ano)
              ->andWhere('r.mes = ?', $mes);
            $existente = $q->fetchOne();
            if ($existente != null)
            {
                $existente->setValor($valor);
                $existente->save();
                return 'actualizado';
                //$this->getUser()->setFlash('notice', sprintf('El indicador se ha actualizado correctamente.'));
                //$this->redirect('indicador');
            }
            else
            {
                $real = new reales();
                $real->setIndicadorId($indicador->getId());
                $real->setAno($ano);
                $real->setMes($mes);
                $real->setValor($valor);
                $real->save();
                return 'ejecutado';
            }
        }
     }

  protected function tieneWhere($consulta)
  {
        if(substr_count(strtoupper($consulta), 'WHERE') > 0 )
        {
            return true;
        }
        else
        {
            return false;
        }
    }

  protected function ejecutarSQL($consulta)
  {
        $statement = Doctrine_Manager::getInstance()->connection();
        $results = $statement->execute($consulta);
        return $results->fetchAll();
    }

  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';

      try {
        $reales = $form->save();
      } catch (Doctrine_Validator_Exception $e) {

        $errorStack = $form->getObject()->getErrorStack();

        $message = get_class($form->getObject()) . ' has ' . count($errorStack) . " field" . (count($errorStack) > 1 ?  's' : null) . " with validation errors: ";
        foreach ($errorStack as $field => $errors) {
            $message .= "$field (" . implode(", ", $errors) . "), ";
        }
        $message = trim($message, ', ');

        $this->getUser()->setFlash('error', $message);
        return sfView::SUCCESS;
      }

      $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $reales)));

      if ($request->hasParameter('_save_and_add'))
      {
        $this->getUser()->setFlash('notice', $notice.' You can add another one below.');

        $this->redirect('@reales_new');
      }
      else if ($request->hasParameter('_save_and_list'))
      {
          $this->getUser()->setFlash('notice', $notice);
          $this->redirect('indicador');
      }
      else
      {
        $this->getUser()->setFlash('notice', $notice);

        $this->redirect(array('sf_route' => 'reales_edit', 'sf_subject' => $reales));
      }
    }
    else
    {
      $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
    }
  }
}
